﻿שמירת נתונים
============

שמירת נתונים במטמון היא דרך לשמירת משתנה PHP במטמון וקבלתו בזמן מאוחר יותר. למטרה זו, המחלקה הבסיסית של המטמון [CCache] מספקת שני מתודות עם השימוש הנפוץ ביותר: [set|CCache::set] ו [get|CCache::get].

כדי לשמור את המשתנה `value$` במטמון, אנו בוחרים מזהה יחודי כלשהו וקוראים למתודה [set|CCache::set] כדי לשמור אותה:

~~~
[php]
Yii::app()-»cache-»set($id, $value);
~~~

התוכן הנשמר יאוחסן במטמון לעד אלה אם כן הוא ימחק מסיבות שאינן תלויות באפליקציה (לדוגמא, מקום האחסון של המטמון מלא והפריטים הישנים ביותר שנשמרו ימחקו). כדי לשנות התנהגות זו, אנו יכולים להוסיף פרמטר שלישי אשר יגדיר את תפוקת הנתונים אותם אנו שומרים בזמן קריאה ל [set|CCache::set] כדי שהתוכן שנשמר במטמון ימחק אחרי פרק זמן מסויים:

~~~
[php]
// keep the value in cache for at most 30 seconds
Yii::app()-»cache-»set($id, $value, 30);
~~~

בזמן מאוחר יותר כשאנו צריכים לגשת למשתנה זה (בבקשה הנוכחית או אחרת), אנו קוראים למתודה א עם אותו מזהה יחודי בו שמרנו את הנתונים כדי לקבל אותם מהמטמון. אם הערך שהתקבל מהקריאה שווה ל `false`, זה אומר שהנתון לא נמצא במטמון ועלינו ליצור אותו שוב פעם.

~~~
[php]
$value=Yii::app()-»cache-»get($id);
if($value===false)
{
    // regenerate $value because it is not found in cache
    // and save it in cache for later use:
    // Yii::app()-»cache-»set($id,$value);
}
~~~

‎כשבוחרים מזהה יחודי בתור השם של המטמון אותו שומרים, וודא שאותו שם הוא יחודי בקרב כל שאר המשתנים הניתנים לשמירה במטמון באפליקציה. אין צורך שהשם יהיה יחודי בין אפליקציות שונות מאחר ורכיב זה מספיק חכם כדי להבדיל בין האפליקציות בהם הוא רץ.

חלק מאפשרויות האחסון, כמו MemCache, APC, תומכים באפשרות של קבלת כמה נתונים מהמטמון בקריאה אחת כקבוצה, פעולה זו חוסכת בזמן הלקוח לקבלת נתון מהמטמון. מגרסא 1.0.8, ישנה מתודה חדשה בשם [mget|CCache::mget] כדי ליישם אפשרות זו. במידה ורכיב האחסון בו משתמשים לא תומך באפשרות זו כברירת מחדל, האפליקציה תחקה את הפעולה שהמתודה [mget|CCache::mget] מבצעת.

כדי למחוק נתון מהמטמון, יש לקרוא למתודה [delete|CCache::delete]; ובכדי להוריד את כל הנתונים מהמטמון יש לקרוא למתודה [flush|CCache::flush]. יש להזהר בעת השימוש במתודה [flush|CCache::flush] מאחר והיא מוחקת נתונים במטמון מאפליקציות אחרות.

» Tip|טיפ: מאחר והמחלקה [CCache] מיישמת את הממשק `ArrayAccess`, ניתן להשתמש במטמון בתור מערך. להלן כמה דוגמאות:
» ~~~
» [php]
» $cache=Yii::app()-»cache;
» $cache['var1']=$value1;  // equivalent to: $cache-»set('var1',$value1);
» $value2=$cache['var2'];  // equivalent to: $value2=$cache-»get('var2');
» ~~~

הגדרת תלות למטמון
----------------

מלבד הגדרת זמן קיום המטמון, ניתן להגדיר תלות מסויימת לנתונים הנשמרים במטמון כדי `לבטל` את אותם נתונים שנשמרו. לדוגמא, אם אנו שומרים תוכן של קובץ מסויים במטמון והקובץ ההוא השתנה, אנו צריכים לבטל את הנתון השמור במטמון ולשמור את תוכן הקובץ במטמון שוב פעם.

אנו מייצגים תלות באובייקט של [CCacheDependency] או מחלקות היורשות ממנו. אנו קוראים לתלות מסויימת בזמן קריאה למתודה [set|CCache::set] והגדרתו כפרמטר רבעי.

~~~
[php]
// the value will expire in 30 seconds
// it may also be invalidated earlier if the dependent file is changed
Yii::app()-»cache-»set($id, $value, 30, new CFileCacheDependency('FileName'));
~~~

כעת, אם נשלוף את המשתנה `value$` מתוך המטמון על ידי קריאה למתודה [get|CCache::get], התלות תכנס לפעולה ובמידה והקובץ השתנה, אנו נקבל ערך השווה ל `false`, האומר שצריך ליצור מחדש את התוכן השמור במטמון.

למטה רשומים בקצרה התלויות הקיימות למטמון:

- [CFileCacheDependency]: התלות משתנה אם הזמן האחרון בו הקובץ נערך השתנה.

- [CDirectoryCacheDependency]: התלות משתנה אם ישנו שינוי בכל אחד מהקבצים הנמצאים בתיקיה ותתי-תיקיות.

- [CDbCacheDependency]: התלות משתנה במידה והתוצאה של השאילתה השתנתה.

- [CGlobalStateCacheDependency]: התלות משתנה במידה והערך הגלובלי שהוזן השתנה. משתנה גלובלי באפליקציה הינו משתנה אשר קיים לאורך כל האפליקציה. הוא מוגדר על ידי [CApplication::setGlobalState].

- [CChainedCacheDependency]: התלות משתנה במידה וכל אחד מהתלויות המשורשרות משתנה.

- [CExpressionDependency]: התלות משתנה במידה והתוצאה של ביטוי ה PHP היא שונה. מחלקה זו קיימת מגרסאות 1.0.4 ומעלה.

«div class="revision"»$Id: caching.data.txt 1855 2010-03-04 22:42:32Z qiang.xue $«/div»